package cn.csg.iotplatform.module.system.api.dept;

import cn.csg.iotplatform.framework.common.pojo.CommonResult;
import cn.csg.iotplatform.framework.common.util.object.BeanUtils;
import cn.csg.iotplatform.framework.datapermission.core.annotation.DataPermission;
import cn.csg.iotplatform.module.system.api.dept.dto.AdministrationDTO;
import cn.csg.iotplatform.module.system.api.dept.dto.DeptRespDTO;
import cn.csg.iotplatform.module.system.api.dept.dto.GetDeptDtoObjAllListRespDTO;
import cn.csg.iotplatform.module.system.dal.dataobject.dept.AdminAreaDO;
import cn.csg.iotplatform.module.system.dal.dataobject.dept.DeptDO;
import cn.csg.iotplatform.module.system.dal.dataobject.user.AdminUserDO;
import cn.csg.iotplatform.module.system.service.dept.DeptService;
import cn.csg.iotplatform.module.system.service.user.AdminUserService;
import cn.hutool.core.collection.CollUtil;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;

import static cn.csg.iotplatform.framework.common.pojo.CommonResult.success;

@RestController // 提供 RESTful API 接口，给 Feign 调用
@Validated
public class DeptApiImpl implements DeptApi {

    @Resource
    private DeptService deptService;

    @Resource
    private AdminUserService userService;

    @Override
    public CommonResult<DeptRespDTO> getDept(Long id) {
        DeptDO dept = deptService.getDept(id);
        return success(BeanUtils.toBean(dept, DeptRespDTO.class));
    }

    @Override
    public CommonResult<DeptRespDTO> getDeptAsynVersion(Long id, String authorization) {
        DeptDO dept = deptService.getDept(id);
        return success(BeanUtils.toBean(dept, DeptRespDTO.class));
    }

    @Override
    @DataPermission(enable = false)
    public CommonResult<Map<Long, DeptRespDTO>> getDeptByUserIdsToDeptMap(Collection<Long> userIds) {
        List<AdminUserDO> adminUser = userService.getUserList(userIds);
        Map<Long, Long> map = new HashMap<>();
        for (AdminUserDO item : adminUser) {
            Long deptId = item.getDeptId();
            if (deptId != null) {
                map.put(deptId, item.getId());
            }
        }
        Set<Long> set = adminUser.stream().map(AdminUserDO::getDeptId).collect(Collectors.toSet());
        if (CollUtil.isNotEmpty(set)) {
            List<DeptRespDTO> list = getDeptList(set).getCheckedData();
            Map<Long, DeptRespDTO> deptRespDTOMap = new HashMap<>();
            list.forEach(item -> deptRespDTOMap.put(map.get(item.getId()), item));
            return success(deptRespDTOMap);
        }
        return success(new HashMap<>());

    }

    @Override
    public CommonResult<DeptRespDTO> getDeptByOrgId(String orgId) {
        DeptDO dept = deptService.getDeptByOrgId(orgId);
        return success(BeanUtils.toBean(dept, DeptRespDTO.class));
    }

    @Override
    @DataPermission(enable = false)
    public CommonResult<DeptRespDTO> getDeptBySapHrOrgId(String sapHrOrgId, String eqOrgCode) {
        DeptDO dept = deptService.getDeptBySapHrOrgId(sapHrOrgId,eqOrgCode);
        return success(BeanUtils.toBean(dept, DeptRespDTO.class));
    }

    @Override
    public CommonResult<List<DeptRespDTO>> getDeptList(Collection<Long> ids) {
        List<DeptDO> depts = deptService.getDeptList(ids);
        return success(BeanUtils.toBean(depts, DeptRespDTO.class));
    }

    @Override
    public CommonResult<List<Map<String, Object>>> getDeptAllList() {
        List<Map<String, Object>> depts = deptService.getDeptList();
        return success( depts );
    }

    @Override
    public CommonResult<List<GetDeptDtoObjAllListRespDTO>> getDeptDtoObjAllList() {
        List<DeptDO> deptDOS = deptService.queryDeptList();
        List<GetDeptDtoObjAllListRespDTO> collect = deptDOS.stream().map(v -> {
            GetDeptDtoObjAllListRespDTO getDeptDtoObjAllListRespDTO = new GetDeptDtoObjAllListRespDTO();
            getDeptDtoObjAllListRespDTO.setId(v.getId());
            getDeptDtoObjAllListRespDTO.setOrgId(v.getOrgId());
            getDeptDtoObjAllListRespDTO.setOrgCode(v.getOrgCode());
            getDeptDtoObjAllListRespDTO.setName(v.getName());
            getDeptDtoObjAllListRespDTO.setParentId(v.getParentId());
            getDeptDtoObjAllListRespDTO.setFullPathId(v.getFullPathId());
            getDeptDtoObjAllListRespDTO.setFullPathOrgId(v.getFullPathOrgId());
            getDeptDtoObjAllListRespDTO.setFullPathName(v.getFullPathName());
            getDeptDtoObjAllListRespDTO.setSort(v.getSort());
            getDeptDtoObjAllListRespDTO.setLeaderUserId(v.getLeaderUserId());
            getDeptDtoObjAllListRespDTO.setPhone(v.getPhone());
            getDeptDtoObjAllListRespDTO.setEmail(v.getEmail());
            getDeptDtoObjAllListRespDTO.setStatus(v.getStatus());
            getDeptDtoObjAllListRespDTO.setTreePath(v.getTreePath());
            getDeptDtoObjAllListRespDTO.setUserAttr(v.getUserAttr());
            getDeptDtoObjAllListRespDTO.setProjectAttr(v.getProjectAttr());
            getDeptDtoObjAllListRespDTO.setDeptType(v.getDeptType());
            getDeptDtoObjAllListRespDTO.setShortName(v.getShortName());
            getDeptDtoObjAllListRespDTO.setUseFlag(v.getUseFlag());
            getDeptDtoObjAllListRespDTO.setIs4A(v.getIs4A());
            getDeptDtoObjAllListRespDTO.setOrgType(v.getOrgType());
            getDeptDtoObjAllListRespDTO.setOrgStructureId(v.getOrgStructureId());
            getDeptDtoObjAllListRespDTO.setOrgLevel(v.getOrgLevel());
            getDeptDtoObjAllListRespDTO.setShortSpell(v.getShortSpell());
            getDeptDtoObjAllListRespDTO.setFullSpell(v.getFullSpell());
            getDeptDtoObjAllListRespDTO.setAreaId(v.getAreaId());
            getDeptDtoObjAllListRespDTO.setSapHrOrgId(v.getSapHrOrgId());
            getDeptDtoObjAllListRespDTO.setEqOrgCode(v.getEqOrgCode());
            getDeptDtoObjAllListRespDTO.setProvinceUnit(v.getProvinceUnit());
            getDeptDtoObjAllListRespDTO.setCityUnit(v.getCityUnit());
            getDeptDtoObjAllListRespDTO.setDistrictUnit(v.getDistrictUnit());
            getDeptDtoObjAllListRespDTO.setParentName(v.getParentName());
            return getDeptDtoObjAllListRespDTO;
        }).collect(Collectors.toList());
        return success( collect );
    }

    @Override
    public CommonResult<Boolean> validateDeptList(Collection<Long> ids) {
        deptService.validateDeptList(ids);
        return success(true);
    }

    @Override
    public CommonResult<Set<Long>> getChildDeptIds(Long parentId) {
        return success(deptService.getChildDeptIdListFromCache(parentId));
    }

    @Override
    public CommonResult<List<AdministrationDTO>> getDeptAreaSetting(Long unitId) {

        List<AdminAreaDO> adminAreaDOS = deptService.selectAdminAreaSetting(unitId);

        return success(BeanUtils.toBean(adminAreaDOS, AdministrationDTO.class));
    }


    @Override
    public CommonResult<List<DeptRespDTO>> queryDeptList() {

        List<DeptDO> depts = deptService.queryDeptList();
        return success( BeanUtils.toBean( depts, DeptRespDTO.class ) );
    }

}
